package com.haiwei.poi.word.manager;

import com.haiwei.poi.common.HaiweiStringUtil;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 文本解析器.
 *
 * @date: 2022-06-24
 * @version: 1.0
 * @author: karry@haiwei.com
 */
public class HaiweiPatternUtil {
    
    private static Pattern MERGE_PATTERN = Pattern.compile("(#{1,}|##=|##={0,1}\\{[^}]{0,}?)$");
    
    private static String PLACE_HOLDER_PATTERN_REGEX = "([\\s|\\S]*)##\\{([A-Za-z0-9\\u4e00-\\u9fa5\\.\\&\\:\\=]+)\\}([\\s|\\S]*)";
    
    private static Pattern PLACE_HOLDER_PATTERN = Pattern.compile(PLACE_HOLDER_PATTERN_REGEX);
    
    /**
     * 路径只允许：
     * 英文大小写，数字，点，中文
     * 注意：不允许有空格
     */
    private static Pattern PATH_CHAR_PERMIT_PATTERN = Pattern.compile("^[\\u4e00-\\u9fa5A-Za-z0-9\\.]+$");
    
    /**
     * 检查path是否有效
     * @param path
     * @return
     */
    public static boolean checkPathChar(String path){
        if(HaiweiStringUtil.isEmpty(path)){
            return false;
        }
    
        return PATH_CHAR_PERMIT_PATTERN.matcher(path).find();
    }
    
    /**
     * 判断一个字符是不是完整的占位符
     * ##{customer.name}
     * @param text
     * @return
     */
    public static boolean containPlaceHolder(String text){
        if(HaiweiStringUtil.isEmpty(text)){
            return false;
        }
        HaiweiStringUtil.removeWhitespace(text);
        return PLACE_HOLDER_PATTERN.matcher(text).find();
    }
    
    /**
     * 解析占位符
     * ##{customer.name}
     * @param text
     * @return
     */
    public static String[] parsePlaceHolder(String text){
        if(HaiweiStringUtil.isEmpty(text)){
            return new String[3];
        }
    
        Matcher matcher = PLACE_HOLDER_PATTERN.matcher(text);
        if(matcher.find() && matcher.groupCount() == 3){
            return new String[]{matcher.group(1),matcher.group(2),matcher.group(3)};
        }
        
        return new String[3];
    
    }
    
    /**
     * 判断一个字符串是否为 占位符部分
     * 场景：除loop标签除外,其他均可以判断
     * ##{customer.name}
     * @param text
     * @return
     */
    public static boolean isNeededMergeRun(String text){
        if(HaiweiStringUtil.isEmpty(text)){
            return false;
        }
        return MERGE_PATTERN.matcher(text).find();
    }

}
